package com.caolei1992.web.vo;

import lombok.Getter;
import lombok.Setter;

/**
 * @author caolei
 * @since 2019/3/31
 */
@Setter
@Getter
public class AjaxResult<T> {
    /**
     * 状态码
     */
    private int code;

    /**
     * 返回消息
     */
    private String msg;

    /**
     * 返回的对象
     */
    private T data;


    /**
     * 失败码
     */
    private static final int FAIL_CODE = -1;

    /**
     * 正确码
     */
    private static final int SUCCESS_CODE = 0;

    /**
     * 初始化Result对象
     *
     * @param code
     * @param message
     * @param object
     * @param <T>
     * @return
     */
    private static <T> AjaxResult<T> initResult(int code, String message, T object) {
        AjaxResult<T> ajaxResult = new AjaxResult<>();
        ajaxResult.setCode(code);
        ajaxResult.setMsg(message);
        ajaxResult.setData(object);
        return ajaxResult;
    }


    /**
     * 成功
     *
     * @param <T>
     * @return
     */
    public static <T> AjaxResult<T> success() {
        return initResult(SUCCESS_CODE, "操作成功", null);
    }

    /**
     * 成功
     *
     * @param message 提示语
     * @param object  返回的数据
     * @param <T>
     * @return
     */
    public static <T> AjaxResult<T> success(String message, T object) {
        return initResult(SUCCESS_CODE, message, object);
    }

    /**
     * 成功
     *
     * @param object 返回的数据
     * @param <T>
     * @return
     */
    public static <T> AjaxResult<T> success(T object) {
        return initResult(SUCCESS_CODE, "操作成功", object);
    }

    /**
     * 成功
     *
     * @param message 提示语
     * @param <T>
     * @return
     */
    public static <T> AjaxResult<T> success(String message) {
        return initResult(SUCCESS_CODE, message, null);
    }


    /**
     * 失败
     *
     * @param message 提示语
     * @param object  返回的数据
     * @param <T>
     * @return
     */
    public static <T> AjaxResult<T> fail(String message, T object) {
        return initResult(FAIL_CODE, message, object);
    }

    /**
     * 失败
     *
     * @param message 提示语
     * @param <T>
     * @return
     */
    public static <T> AjaxResult<T> fail(String message) {
        return initResult(FAIL_CODE, message, null);
    }

    /**
     * 失败
     *
     * @param message 提示语
     * @param status  狀態
     * @param <T>
     * @return
     */
    public static <T> AjaxResult<T> failWithStatus(Integer status, String message) {
        return initResult(status == null ? FAIL_CODE : status, message, null);
    }

    public boolean isSuccess() {
        return this.code == SUCCESS_CODE;
    }


}
